import UIKit

/**
 B站：https://www.bilibili.com/video/BV144411C7Gg?p=7
 
 第7课内容
     1. switch case
     
     2. fallthrough 穿透效果
 */


// 一、普通方式

//let a = 10 // 可切换方便 被注释掉了
var a = 20 // 可切换方便 被注释掉了

switch a {
    case 5:
        print("情况0")
    case 10:
        print("情况1")
    case 20:
        print("情况2")
    default:
        print("情况2")
}

print("--------------")

switch a {
    case 5:
        print("22 - 情况0")
        fallthrough
    case 10:
        print("22 - 情况1")
        fallthrough
    case 20:
        print("22 - 情况2")
        fallthrough
    default:
        print("22 - 情况2")
}

print("--------------")


//--------------------------------------------------------------------------------
// 二、多条件方式

//var b = "a" // 可切换方便 被注释掉了
let b = "c" // 可切换方便 被注释掉了
//let b = "d" // 可切换方便 被注释掉了
//let b = "e" // 可切换方便 被注释掉了
//let b = "5" // 可切换方便 被注释掉了

switch b {
    case "a", "b", "c":
        print("bb - 1")
    case "d", "e", "f":
        print("bb - 2")
    default:
        print("bb - default")
}

print("--------------")


//--------------------------------------------------------------------------------
// 三、元组条件 方式

let c = ("hello", 1)
//let c = ("hello", 10) // 可切换方便 被注释掉了
//let c = ("hello", 20) // 可切换方便 被注释掉了
//let c = false // 必须是 元组，不然崩溃 // 可切换方便 被注释掉了

switch c {
    case ("hello", 10):
        print("cc - 1")
    case ("hello", 20):
        print("cc - 2")
    default:
        print("cc - default")
}


switch c {
    // 第一种 : 一般来说，没有意义，和打印没区别
    //                                     疑问:不知道是不是作为 多元元组 筛选条件
//    case let(name, age):
//        print("cc-2 name=", name, " age=", age)
    
    // 第二种 : 元组中确定某个 位置的值，作为判断条件
    case let(name2, 10):
        print("cc-2 name2=", name2)
    
    // 第三种
    case ("hello", 20): //case let("hello", 20): 可以不必写let
        print("cc-2 aaaaaaaaaaa")
    
    // 第四种
    case let(_, age) where age<10:
        print("cc-2 bbbbbbbb")
    default:
        print("cc-2 元组 default")
}
// 【注意】  let、var   后面 和元组，没有空格



print("--------------")

//--------------------------------------------------------------------------------
// 四、区间运算符 方式

//let d = 3     // 结果5 // 可切换方便 被注释掉了
let d = 5     // 结果10 // 可切换方便 被注释掉了
//let d = 10    // 结果default // 可切换方便 被注释掉了

switch d {
    case 1..<5:
        print("dd - 小于5")
    case 1..<10:
        print("dd - 小于10")
    default:
        print("dd - 不知道")
}
print("--------------")
//--------------------------------------------------------------------------------
